package Z04FanXin.FX01ofArray;

import Z007InterfaceAndExtends.O01InterfaceJiekou.ADHero;
import Z007InterfaceAndExtends.O01InterfaceJiekou.APHero;
import Z007InterfaceAndExtends.O01InterfaceJiekou.Hero;

import java.util.ArrayList;

public class OfFanXin {}
/*
 不使用泛型带来的问题
 ADHero（物理攻击英雄） APHero（魔法攻击英雄）都是Hero的子类
 ArrayList 默认接受Object类型的对象，所以所有对象都可以放进ArrayList中
 所以get(0) 返回的类型是Object
 接着，需要进行强制转换才可以得到APHero类型或者ADHero类型。
 如果软件开发人员记忆比较好，能记得哪个是哪个，还是可以的。
 但是开发人员会犯错误，比如第28行，会记错，把第0个对象转换为ADHero,
 这样就会出现类型转换异常
 */
class Text{
    public static void main(String[] args) {
        ArrayList heros = new ArrayList();
        heros.add(new APHero());
        heros.add(new ADHero());

        APHero apHero = (APHero) heros.get(0);
        ADHero adHero = (ADHero) heros.get(1);

        // ADHero adHero2 = (ADHero) heros.get(0);
        // 转型异常 .ClassCastException

        System.out.println("===============================");

        ArrayList<APHero> heroes1 = new ArrayList<APHero>();
        //只有APHero可以放进去
        heroes1.add(new APHero());

        // heroes1.add(new ADHero());
        // 获取的时候也不需要进行转型，因为取出来一定是APHero
        APHero apHero1 = heroes1.get(0);

        System.out.println("==============================");

        ArrayList<Hero> heroes2 = new ArrayList<Hero>();

        //只有作为Hero的子类可以放进去
        heroes2.add(new APHero());
        heroes2.add(new ADHero());
        //和Hero无关的类型Item还是放不进去
        //heros.add(new Item());

        System.out.println("===============================");
        ArrayList<Hero> arrayList = new ArrayList<Hero>();
        //后面可以只用<>
        ArrayList<Hero> arrayList3 = new ArrayList<>();

    }
}

